/**
	 \file tri.cpp

    \brief Bibliothèque regroupant les fonctions de tri

    \author   Clement ZOTTI 11074801
    \date     date_de_la_version_courante
    \version  numero_de_version.numero_de_modification (xx.yy)

	Cette bibliothèque à pour but de regrouper toutes les fonction de tri
	vu dans le cours ift159 pour le projet aide-pilote.
	Elle implémente des algorithmes de tri de manière récursive ou non.

    Date de la première version: 04/03/2012 \n

    Date de modification:
        \li 04/03/2012 Clement ZOTTI, mise en place
*/

// #include <cstring>
#include <cstdio>

using namespace std;

/**
	\brief fonction de tri_selectif pour des entiers. Récursif !

	Cette fonction tri une matrice par rapport au valeur entière
	de sa troisième colonne, elle tri aussi un tableau de nom
	par rapport au tri des entiers.
	
	Cette fonction est correcte.
	Cette fonction n'est pas robuste.

	\param[in,out] tab (tableau contenant les entiers à trier)
	\param[in,out] tab_suiv (tableau de caractères trier a partir de l'autre tableau)

	\return code d'erreur ou succes.
*/
void swap_t_reel(float ia[], float ib[])
{
    float tmpi;

    for (int i = 0; i < NB_COORD; i++)
    {
        tmpi = ib[i];
        ib[i] = ia[i];
        ia[i] = tmpi;
    }
}

/**
	\brief fonction d'échange pour des caractères.

	Cette fonction échange deux chaines de caractères se terminant par un "."
		
	Cette fonction est correcte.
	Cette fonction n'est pas robuste.

	\param[in,out] ca (tableau contenant les réels à trier)
	\param[in,out] cb (tableau de caractères trier a partir de l'autre tableau)

	\return code d'erreur ou succes.
*/
void swap_t_car( char ca[], char cb[])
{
    char tmpc;
    int indexmax, cpt;

    cpt=0;
	while (ca[cpt] != SEP_ACTION) cpt++;
	indexmax = cpt;
	
    cpt=0;
    while (cb[cpt] != SEP_ACTION)cpt++;
	if (cpt>indexmax)
		indexmax = cpt;

    for (int i = 0 ; i <= indexmax; i++)
    {
        tmpc = ca[i];
        ca[i] = cb[i];
        cb[i] = tmpc;
    }
}


/**
	\brief fonction de tri_selectif pour des entiers. Récursif !

	Cette fonction tri une matrice par rapport au valeur entière
	de sa troisième colonne, elle tri aussi un tableau de nom
	par rapport au tri des entiers.
	
	Cette fonction est correcte.
	Cette fonction n'est pas robuste.

	\param[in,out] tab (matrice contenant les réels à trier)
	\param[in,out] tab_suiv (matrice de caractères trier à partir de l'autre matrice)
	\param[in] index maximal des tableaux

	\return code d'erreur ou succes.
*/
int tri_selectif_reel_r_dual(float coord[MAX_AEROPORT][NB_COORD],
                               char nom[MAX_AEROPORT][MAX_CARACTERES],
                               int max)
{
    // Déclaration des fonctions
    void swap_t_reel(float[], float[]);
    void swap_t_car(char[], char[]);

    // Déclaration des variables
    int index = 0;
    float tmp = 0;
    if (max > 1)
    {
        for (int i=0; i < max; i++)
        {
            if (tmp < coord[i][DIST])
            {
                index = i;
                tmp = coord[i][DIST];
            }
        }

        swap_t_reel(coord[index], coord[max-1]);
        swap_t_car(nom[index], nom[max-1]);

        tri_selectif_reel_r_dual(coord, nom, max-1);
    }
    return 0;
}

/**
	\brief fonction de tri_selectif pour des caractères. Récursif !
1
	Cette fonction tri une matrice par rapport aux valeurs des
	caractères qui la compose, elle tri aussi un tableau de nom
	par rapport au tri des entiers.
	
	Cette fonction est correcte.
	Cette fonction n'est pas robuste.

	\param[in,out] tab (matrice de caractères à trier)
	\param[in,out] tab_suiv (matrice contenant les réels trier à partir de l'autre matrice)
	\param[in] index maximal des matrice

	\return code d'erreur ou succes.
*/
int tri_selectif_carac_r_dual(char tab[MAX_AEROPORT][MAX_CARACTERES],
                              float tab_suiv[MAX_AEROPORT][NB_COORD],
                              int max)
{
    // Déclaration des fonctions

    // Déclaration des variables
    int index = 0;

    if (max > 1)
    {
        for (int i=0; i < max; i++)
        {
            for (int j = 0; j < MAX_CARACTERES; j++)
            {
                if (tab[index][j] < tab[i][j])
                {
                    index = i;
                    j=MAX_CARACTERES;
                } else if (tab[index][j] > tab[i][j])
                    j=MAX_CARACTERES;
            }
        }

        swap_t_car(tab[index], tab[max-1]);
        swap_t_reel(tab_suiv[index], tab_suiv[max-1]);

        tri_selectif_carac_r_dual(tab, tab_suiv, max-1);
    }
    return 0;
}

